home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / SOUND.SWG / 0042_TP AND SOUND BLASTER.pas < prev    next >
Pascal/Delphi Source File  |  1994-05-25  |  3KB  |  117 lines

  1. {
  2. CL▒    Come to speak of this...  do you (or anyone) know which ports to zap the
  3. CL▒    data to for the SB to get it to play?  Or better yet, even how to get it
  4. CL▒    to play in DMA transfer mode?
  5.  
  6. Try this code.
  7. }
  8. (* A unit to provide basic control over a Sound Blaster or compatible card.*)
  9. (* It works by reading and writing to the standard Sound Blaster ports.    *)
  10. (* Released to the public domain by Brian Grainger, Sparwood, BC.          *)
  11.  
  12. UNIT SoundBlaster;
  13.  
  14. (*********************************)INTERFACE(********************************)
  15.  
  16. PROCEDURE sbSetAddressDelay(StereoMode : BYTE);
  17. PROCEDURE sbSetDataDelay(StereoMode : BYTE);
  18. PROCEDURE sbSetDataReg(RegNum, Value, StereoMode : BYTE);
  19. FUNCTION  sbGetStatus(StereoMode : BYTE) : BYTE;
  20. PROCEDURE sbResetTimers;
  21. PROCEDURE sbEnableInterrupts;
  22. PROCEDURE sbTurnOff;
  23. FUNCTION  sbIsInstalled : BOOLEAN;
  24.  
  25. (*******************************)IMPLEMENTATION(*****************************)
  26.  
  27. CONST
  28.   cMono  = 0;
  29.   cLeft  = 1;
  30.   cRight = 2;
  31.  
  32. VAR
  33.   vStatus1 : BYTE;
  34.   vStatus2 : BYTE;
  35.   vDelay   : BYTE;
  36.   vI       : BYTE;
  37.  
  38. PROCEDURE sbSetAddressDelay(StereoMode : BYTE);
  39.   BEGIN
  40.     FOR vI := 0 TO 5 DO
  41.       CASE StereoMode OF
  42.         cMono  : vDelay := Port[$388];
  43.         cLeft  : vDelay := Port[$220];
  44.         cRight : vDelay := Port[$222];
  45.       END;
  46.   END;
  47.  
  48. PROCEDURE sbSetDataDelay(StereoMode : BYTE);
  49.   BEGIN
  50.     FOR vI := 0 TO 34 DO
  51.       CASE StereoMode OF
  52.         cMono  : vDelay := Port[$388];
  53.         cLeft  : vDelay := Port[$220];
  54.         cRight : vDelay := Port[$222];
  55.       END;
  56.   END;
  57.  
  58. PROCEDURE sbSetDataReg(RegNum, Value, StereoMode : BYTE);
  59.   BEGIN
  60.     CASE StereoMode OF
  61.       cMono  : Port[$388] := RegNum;
  62.       cLeft  : Port[$220] := RegNum;
  63.       cRight : Port[$222] := RegNum;
  64.     END;
  65.     sbSetAddressDelay(StereoMode);
  66.     CASE StereoMode OF
  67.       cMono  : Port[$389] := Value;
  68.       cLeft  : Port[$221] := Value;
  69.       cRight : Port[$222] := Value;
  70.     END;
  71.     sbSetDataDelay(StereoMode);
  72.   END;
  73.  
  74. FUNCTION sbGetStatus(StereoMode : BYTE) : BYTE;
  75.   BEGIN
  76.     sbGetStatus := 0;
  77.     CASE StereoMode OF
  78.       cMono  : sbGetStatus := Port[$388];
  79.       cLeft  : sbGetStatus := Port[$220];
  80.       cRight : sbGetStatus := Port[$222];
  81.     END;
  82.   END;
  83.  
  84. PROCEDURE sbResetTimers;
  85.   BEGIN
  86.     sbSetDataReg($04, $60, cMono);
  87.   END;
  88.  
  89. PROCEDURE sbEnableInterrupts;
  90.   BEGIN
  91.     sbSetDataReg($04, $80, cMono);
  92.   END;
  93.  
  94. PROCEDURE sbTurnOff;
  95.   BEGIN
  96.     FOR vI := $01 TO $F5 DO
  97.       sbSetDataReg(vI, $00, cMono);
  98.   END;
  99.  
  100. FUNCTION sbIsInstalled : BOOLEAN;
  101.   BEGIN
  102.     sbIsInstalled := FALSE;
  103.     sbResetTimers;
  104.     sbEnableInterrupts;
  105.     vStatus1 := sbGetStatus(cMono);
  106.     sbSetDataReg($02, $FF, cMono);  (* Set timer 1 data register *)
  107.     sbSetDataReg($04, $21, cMono);  (* Start timer 1             *)
  108.     FOR vI := 1 TO 4 DO
  109.       sbSetDataDelay(cMono);        (* Wait at least 80 uSeconds *)
  110.     vStatus2 := sbGetStatus(cMono);
  111.     sbResetTimers;
  112.     sbEnableInterrupts;
  113.     IF (((vStatus1 AND $E0) = $00) AND ((vStatus2 AND $E0) = $C0)) THEN
  114.       sbIsInstalled := TRUE;
  115.   END;
  116. END.
  117.